package com.example.mymap;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.Toast;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.animation.Animation;
import com.baidu.mapapi.animation.Transformation;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.CircleOptions;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.LogoPosition;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.PolylineOptions;
import com.baidu.mapapi.map.Stroke;
import com.baidu.mapapi.map.TextOptions;
import com.baidu.mapapi.map.UiSettings;
import com.baidu.mapapi.model.LatLng;

import java.util.ArrayList;
import java.util.List;

import static com.baidu.mapapi.map.MyLocationConfiguration.*;

public class MainActivity extends AppCompatActivity {
    private MapView mapView = null;
    private LocationClient locationClient;
    private BaiduMap mBaiduMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取地图控件引用
        mapView = (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mapView.getMap();

        //设置卫星地图
       // mapView.getMap().setMapType(BaiduMap.MAP_TYPE_SATELLITE);
        //设置交通地图
        //mapView.getMap().setTrafficEnabled(true);
        //设置热力图
        //mapView.getMap().setBaiduHeatMapEnabled(true);


        //开启地图定位图层
        mBaiduMap.setMyLocationEnabled(true);
        initmap();

        //地图Logo
        mapView.setLogoPosition(LogoPosition.logoPostionleftTop);

        //指南针
        UiSettings uiSettings = mBaiduMap.getUiSettings();
        uiSettings.setCompassEnabled(true);
        //地图手势  控制是否启用或禁用平移
        uiSettings.setScrollGesturesEnabled(true);
        //控制是否启用或禁用缩放手势
        uiSettings.setZoomGesturesEnabled(true);

        //是否显示比例尺
        mapView.showZoomControls(true);
        //是否显示缩放按钮
        mapView.showScaleControl(true);

        //9.改变地图缩放等级
        mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(16));

        //10 隐藏地图标注
        mBaiduMap.showMapPoi(true);



        //16.marker点击事件

        //地图单击事件监听接口
        BaiduMap.OnMapClickListener listener = new BaiduMap.OnMapClickListener() {
            //latLng 点击的地理坐标
            @Override
            public void onMapClick(LatLng latLng) {
                //12 绘制折线
                writeline(latLng);
                //13绘制圆
                writecirle(latLng);
                //14绘制文本
                writetext(latLng);
                Toast.makeText(MainActivity.this,latLng.toString(),Toast.LENGTH_SHORT).show();
            }
            //点击的 poi 信息
            @Override
            public boolean onMapPoiClick(MapPoi mapPoi) {
                return true;
            }
        };
        //设置地图单击事件监听
        mBaiduMap.setOnMapClickListener(listener);


        //地图双击事件监听接口
        BaiduMap.OnMapDoubleClickListener Doulistener = new BaiduMap.OnMapDoubleClickListener() {
           //双击的地理坐标
            @Override
            public void onMapDoubleClick(LatLng latLng) {
                Toast.makeText(MainActivity.this,latLng.toString(),
                        Toast.LENGTH_SHORT).show();


            }
        };
        mBaiduMap.setOnMapDoubleClickListener(Doulistener);

        //地图长按事件监听接口
        BaiduMap.OnMapLongClickListener longClickListener = new BaiduMap.OnMapLongClickListener() {
            @Override
            public void onMapLongClick(LatLng latLng) {
                //
                showMaker(latLng);
               //marker点击事件
                showMarker2(latLng);

                //15.showInfoWindow
                showInfoWindow(latLng);
            }
        };
        mBaiduMap.setOnMapLongClickListener(longClickListener);
    }

    //Marker点击事件
    private void showMarker2(LatLng latLng) {
        mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
            //marker被点击时回调的方法
            //若响应点击事件，返回true，否则返回false
            //默认返回false
            @Override
            public boolean onMarkerClick(Marker marker) {
                return false;
            }
        });
    }

    //实现长按显示marker
    private void showMaker(LatLng latLng) {
        //定义Maker坐标点
        LatLng point = new LatLng(latLng.latitude,latLng.longitude);
        //构建Marker图标
        BitmapDescriptor bitmap = BitmapDescriptorFactory
                .fromResource(R.drawable.baidu2);
        //构建MarkerOption，用于在地图上添加Marker
        OverlayOptions option = new MarkerOptions()
                .position(point)
                .icon(bitmap);
        //在地图上添加Marker，并显示
        mBaiduMap.addOverlay(option);
    }

    //15.showInfoWindow
    private void showInfoWindow(LatLng latLng) {
        //用来构造InfoWindow的Button
        Button button = new Button(getApplicationContext());
        button.setBackgroundResource(R.drawable.red);
        button.setText("InfoWindow");

        //构造InfoWindow
        //point 描述的位置点
        //-100 InfoWindow相对于point在y轴的偏移量
        InfoWindow mInfoWindow = new InfoWindow(button, latLng, -50);
        //使InfoWindow生效
        mBaiduMap.showInfoWindow(mInfoWindow);
    }

    //14绘制文本
    private void writetext(LatLng latLng) {
        //文字覆盖物位置坐标
        LatLng llText = new LatLng(latLng.latitude, latLng.longitude);

        //构建TextOptions对象
        OverlayOptions mTextOptions = new TextOptions()
                .text("百度地图SDK") //文字内容
                .bgColor(0xAAFFFF00) //背景色
                .fontSize(24) //字号
                .fontColor(0xFFFF00FF) //文字颜色
                .rotate(0) //旋转角度
                .position(llText);

        //在地图上显示文字覆盖物
        Overlay mText = mBaiduMap.addOverlay(mTextOptions);
    }

    //13绘制圆
    private void writecirle(LatLng latLng) {
        //圆心位置
        LatLng center = new LatLng(latLng.latitude, latLng.longitude);

        //构造CircleOptions对象
        CircleOptions mCircleOptions = new CircleOptions().center(center)
                .radius(400)
                .fillColor(0xAA0000FF) //填充颜色
                .stroke(new Stroke(5, 0xAA00ff00)); //边框宽和边框颜色

        //在地图上显示圆
        Overlay mCircle = mBaiduMap.addOverlay(mCircleOptions);
    }

    //12绘制折线
    private void writeline(LatLng latLng) {
        //构建折线点坐标
        LatLng p1 = new LatLng(latLng.latitude,latLng.longitude-0.004);
        LatLng p2 = new LatLng(latLng.latitude-0.004, latLng.longitude);
        LatLng p3 = new LatLng(latLng.latitude, latLng.longitude+0.004);
        List<LatLng> points = new ArrayList<LatLng>();
        points.add(p1);
        points.add(p2);
        points.add(p3);

        //设置折线的属性
        OverlayOptions mOverlayOptions = new PolylineOptions()
                .width(10)
                .color(0xAAFF0000)
                .points(points);
        //在地图上绘制折线
        //mPloyline 折线对象
        Overlay mPolyline = mBaiduMap.addOverlay(mOverlayOptions);
    }



    //我们通过继承抽象类BDAbstractListener并重写其onReceieveLocation方法来获取定位数据，
    // 并将其传给MapView。  定位
    public class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            //mapView 销毁后不在处理新接收的位置
            if (location == null || mapView == null){
                return;
            }
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息，顺时针0-360
                    .direction(location.getDirection()).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            mapView.getMap().setMyLocationData(locData);
        }
    }
    //定位  通过LocationClient发起定位
    public void initmap(){
        //定位初始化
        locationClient = new LocationClient(this);

        //通过LocationClientOption设置LocationClient相关参数
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true); // 打开gps
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(1000);

        //设置locationClientOption
        locationClient.setLocOption(option);

         //注册LocationListener监听器
        MyLocationListener myLocationListener = new MyLocationListener();
        locationClient.registerLocationListener(myLocationListener);
        //开启地图定位图层
        locationClient.start();
    }

    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume ()，实现地图生命周期管理
        mapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    protected void onDestroy() {
        locationClient.stop();
        mapView.getMap().setMyLocationEnabled(false);
        mapView.onDestroy();
        mapView=null;
        super.onDestroy();
    }
}
